package com.bing.document;

import net.semanticmetadata.lire.imageanalysis.features.global.ACCID;
import net.semanticmetadata.lire.imageanalysis.features.global.AutoColorCorrelogram;
import net.semanticmetadata.lire.imageanalysis.features.global.BinaryPatternsPyramid;
import net.semanticmetadata.lire.imageanalysis.features.global.CEDD;
import net.semanticmetadata.lire.imageanalysis.features.global.ColorLayout;
import net.semanticmetadata.lire.imageanalysis.features.global.EdgeHistogram;
import net.semanticmetadata.lire.imageanalysis.features.global.FCTH;
import net.semanticmetadata.lire.imageanalysis.features.global.FuzzyColorHistogram;
import net.semanticmetadata.lire.imageanalysis.features.global.FuzzyOpponentHistogram;
import net.semanticmetadata.lire.imageanalysis.features.global.Gabor;
import net.semanticmetadata.lire.imageanalysis.features.global.JCD;
import net.semanticmetadata.lire.imageanalysis.features.global.JpegCoefficientHistogram;
import net.semanticmetadata.lire.imageanalysis.features.global.LocalBinaryPatterns;
import net.semanticmetadata.lire.imageanalysis.features.global.LuminanceLayout;
import net.semanticmetadata.lire.imageanalysis.features.global.OpponentHistogram;
import net.semanticmetadata.lire.imageanalysis.features.global.PHOG;
import net.semanticmetadata.lire.imageanalysis.features.global.RotationInvariantLocalBinaryPatterns;
import net.semanticmetadata.lire.imageanalysis.features.global.ScalableColor;
import net.semanticmetadata.lire.imageanalysis.features.global.SimpleColorHistogram;
import net.semanticmetadata.lire.imageanalysis.features.global.Tamura;

public enum GlobalFeature {
	
	/*
	 * 基于颜色（HSV颜色空间）,包括有关图像中颜色相关的信息，提取特征速度慢
	 */
	ACCI(AutoColorCorrelogram.class),

	/*
	 * ACCID特征的目的是寻找不同尺度下最重要的边缘特征，然后把它们和使用 CEDD描述子得到的模糊色彩方案一起储存在一个直方图里
	 */
	ACCID(ACCID.class),
	
	/*
	 * 旋转不变性的局部二值模式的直方图
	 */
	BPP(BinaryPatternsPyramid.class),
	
	/*
	 * 颜色和边缘方向性描述子，将图像的颜色和边缘方向性信息结合起来生成一个144字节的直方图
	 */
	CEDD(CEDD.class),

	/*
	 * MPEG-7多媒体标准描述子中一种高效的颜色特征描述子。通过图像分割、代表颜色选择、离散余弦变换、Z字形扫描四个步骤得到特征描述子。（用于CEDD）
	 */
	CL(ColorLayout.class),

	/*
	 * MPEG-7多媒体标准描述子中一种高效的边缘特征描述子。用一个40个字节的数组构成一个边缘直方图描述子。通过图像分割、计算子图边缘直方图、归一化、计算图像边缘直方图等步骤得到特征描述子。（用于CEDD）
	 */
	EH(EdgeHistogram.class),
	
	/*
	 * 模糊颜色和纹理直方图特征。它从3个模糊单元的组合求得。先将图像分割，然后用两个模糊单元产生模糊颜色直方图，再在第三个模糊单元中将子图经小波变换生成模糊纹理直方图，最后模糊颜色直方图和模糊纹理直方图结合得到FCTH特征描述子
	 */
	FCTH(FCTH.class),
	
	/*
	 * 一种模糊颜色直方图特征。传统颜色直方图对噪音敏感。模糊颜色直方图通过模糊算法产生模糊颜色直方图
	 */
	FCH(FuzzyColorHistogram.class),
	
	/*
	 * 基于对色（对手颜色）空间的简单的模糊64-bin（维）对色直方图
	 */
	FOH(FuzzyOpponentHistogram.class),
	
	/*
	 * 纹理特征通过对图像与gabor滤波器做卷积而得到，gabor滤波器定义为高斯函数与正弦函数的乘积。Gabor特征提取模拟了人类视觉刺激响应，广泛应用于视觉信息理解，例如人脸识别
	 */
	GABOR(Gabor.class),
	
	/*
	 * JCD特征将CEDD和FCTH结合在一个直方图里面
	 */
	JCD(JCD.class),
	
	/*
	 * 原始的局部二值模式特征。在图像每个3*3像素块中，以中心像素为阈值，将相邻的8个像素的灰度值与其进行比较，大于中心像素值的像素点标记为1，反之为0，中心点周围8个点经比较产生8位二进制数，将其转换为十进制数作为中心像素点的LBP值，以此来反映该区域的纹理信息
	 */
	JCH(JpegCoefficientHistogram.class),
	
	/*
	 * 描述子用于灰度或黑白图像。它将图像缩小到很小然后将它作为描述子。
	 */
	LBP(LocalBinaryPatterns.class),
	
	/*
	 * 基于亮度取特征值
	 */
	LL(LuminanceLayout.class),
	
	/*
	 * 简单的64-bin（维）对色直方图，基于对色空间
	 */
	OH(OpponentHistogram.class),

	/*
	 * 描述子大体上就是将几个空间金字塔中不同层（可理解为图像缩小到不同分辨率）的边缘直方图结合在一起
	 */
	PHOG(PHOG.class),
	
	/*
	 * 一个简单的具有旋转不变性的局部二值模式特征
	 */
	RILP(RotationInvariantLocalBinaryPatterns.class),
	
	/*
	 * 是MPEG-7 Scalable Color使用LireFeature的一个打包。可伸缩颜色描述符是MPEG-7标准中颜色描述符的一种。它是固定于HSV空间的颜色直方图，用Haar变化编码，针对不同需求可改变尺寸
	 */
	SC(ScalableColor.class),
	
	/*
	 * 提供一个简单的RGB颜色直方图，用于基于内容的图像检索。在LIRE的SimpleColorHistogram中，维数是可配置的，直方图归一化到每维8位
	 */
	SCH(SimpleColorHistogram.class),
	
	/*
	 * 用粗糙度、对比度、方向度、 线像度、规整度和粗略度六个分量对应于心理学角度上纹理特征的六种属性。前三种最重要，所以LIRE的Tamura特征用前三个分量来实现
	 */
	TAMURA(Tamura.class);

	public static final GlobalFeature[] GLOBAL_FEATURES = GlobalFeature.values();
	
	private Class<? extends net.semanticmetadata.lire.imageanalysis.features.GlobalFeature> globalFeatureClass;
	
	private GlobalFeature(Class<? extends net.semanticmetadata.lire.imageanalysis.features.GlobalFeature> globalFeatureClass) {
		this.globalFeatureClass = globalFeatureClass;
	}

	public Class<? extends net.semanticmetadata.lire.imageanalysis.features.GlobalFeature> getGlobalFeatureClazz() {
		return globalFeatureClass;
	}
	
	public static GlobalFeature getGlobalFeature(Class<? extends net.semanticmetadata.lire.imageanalysis.features.GlobalFeature> globalFeatureClazz) {
		
		for (GlobalFeature globalFeature : GLOBAL_FEATURES) {
			if(globalFeature.getGlobalFeatureClazz().equals(globalFeatureClazz)) {
				return globalFeature;
			}
		}
		return null;
	}
	
	@Override
	public String toString() {
		return this.globalFeatureClass.getName();
	}
}
